home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 2 / Gekikoh Dennoh Club Vol. 2 (Japan).7z / Gekikoh Dennoh Club Vol. 2 (Japan) (Track 01).bin / tools / cd2pcmt / source.lzh / convert.c < prev    next >
Text File  |  1997-10-02  |  13KB  |  532 lines

  1. #include <TNB.H>
  2. #include <pcmlib.h>
  3. #include "cd2pcm.h"
  4. #include "extern.h"
  5.  
  6. void convert( int len )
  7. {
  8. int    rc;
  9. if ( test_fg!=0 ){
  10.     write_size += len;        /* DISKに書き込んだサイズ*/
  11.     return;
  12. }
  13. switch( pcm_mode ){
  14. case 0:
  15.     /*------------ 44.1kHz 16BIT ステレオ ------------*/
  16.     /*---- Intel列びを直す ----*/
  17.     if ( sct_fg == 0 ){            /* SCSITAI 使用フラグ*/
  18.         printf_(" ★Convert [Intel -> Motorola]" CFC "\n" CUP);
  19.         if ( dma_fg!=0 && mach2_fg==0 )
  20.             PLH2P16__( CDPCM_ptr+1,len );
  21.         else    PLH2P16( (void*)CDPCM_ptr,(void*)CDPCM_ptr,len );
  22.     }
  23.     /*---- レート変更 ----*/
  24.     if ( pcm_rate==22050 ){
  25.         printf_(" ★Convert [44.100kHz -> 22.050kHz]" CFC "\n" CUP );
  26.         len = PCMHRATE_( CDPCM_ptr,len );
  27.     }
  28.     /*---- 書き込む ----*/
  29.     printf_(" ★Disk Writing" CFC "\n" CUP);
  30.     rc = WRITE( hdl, CDPCM_ptr, len );
  31.     if ( rc != len ){
  32.         printf("書き込みエラー\n");
  33.         CLOSE(hdl);
  34.         EndtDisp(1);
  35.     }
  36.     write_size += len;        /* DISKに書き込んだサイズ*/
  37.     break;
  38. case CONVERT_PCMA:
  39.     /*------------ 44.1kHz ADPCM ------------*/
  40.     /*---- Intel列びを直す ----*/
  41.     if ( sct_fg == 0 ){            /* SCSITAI 使用フラグ*/
  42.         printf_(" ★Convert [Intel -> Motorola]" CFC "\n" CUP);
  43.         if ( dma_fg!=0 && mach2_fg==0 )
  44.             PLH2P16__( CDPCM_ptr+1,len );
  45.         else    PLH2P16( (void*)CDPCM_ptr,(void*)CDPCM_ptr,len );
  46.     }
  47.     /*---- レート変更 ----*/
  48.     if ( pcm_rate==22050 ){
  49.         printf_(" ★Convert [44.100kHz -> 22.050kHz]" CFC "\n" CUP );
  50.         len = PCMHRATE_( CDPCM_ptr,len );
  51.     }
  52.     /*---- YM2608 ADPCM に変換 -----*/
  53.     printf_(" ★Convert [PCM -> YM2608 ADPCM]" CFC "\n" CUP);
  54.     PTOA_EXEC( CDPCM_ptr,CDPCM_ptr,len );
  55.     len/=4;                // 同じアドレスでも大丈夫のはず
  56.     /*---- 書き込む ----*/
  57.     printf_(" ★Disk Writing" CFC "\n" CUP);
  58.     rc = WRITE( hdl, CDPCM_ptr, len );
  59.     if ( rc != len ){
  60.         printf("書き込みエラー\n");
  61.         CLOSE(hdl);
  62.         EndtDisp(1);
  63.     }
  64.     write_size += len;        /* DISKに書き込んだサイズ*/
  65.     break;
  66. case CONVERT_A88:
  67.     /*------------ 88.2kHz ADPCM ------------*/
  68.     /*---- Intel列びを直す ----*/
  69.     if ( sct_fg == 0 ){            /* SCSITAI 使用フラグ*/
  70.         printf_(" ★Convert [Intel -> Motorola]" CFC "\n" CUP);
  71.         if ( dma_fg!=0 && mach2_fg==0 )
  72.             PLH2P16__( CDPCM_ptr+1,len );
  73.         else    PLH2P16( (void*)CDPCM_ptr,(void*)CDPCM_ptr,len );
  74.     }
  75.     /*---- レート変更 ----*/
  76.     printf_(" ★Convert [44.100kHz -> 88.200kHz]" CFC "\n" CUP );
  77.     len = PCMDRATE_( CDPCM_ptr,len,CDPCMM_ptr );
  78.     /*---- YM2608 ADPCM に変換 -----*/
  79.     printf_(" ★Convert [PCM -> YM2608 ADPCM]" CFC "\n" CUP);
  80.     PTOA_EXEC( CDPCMM_ptr,CDPCMM_ptr,len );
  81.     len/=4;                // 同じアドレスでも大丈夫のはず
  82.     /*---- 書き込む ----*/
  83.     printf_(" ★Disk Writing" CFC "\n" CUP);
  84.     rc = WRITE( hdl, CDPCMM_ptr, len );
  85.     if ( rc != len ){
  86.         printf("書き込みエラー\n");
  87.         CLOSE(hdl);
  88.         EndtDisp(1);
  89.     }
  90.     write_size += len;        /* DISKに書き込んだサイズ*/
  91.     break;
  92. case CONVERT_WAVE:
  93.     /*------------ 44.1kHz 16BIT ステレオ ------------*/
  94.     /*---- レート変更 ----*/
  95.     if ( pcm_rate==22050 ){
  96.         printf_(" ★Convert [44.100kHz -> 22.050kHz]" CFC "\n" CUP );
  97.         len = PCMHRATE_( CDPCM_ptr,len );
  98.     }
  99.     /*---- 書き込む ----*/
  100.     printf_(" ★Disk Writing" CFC "\n" CUP);
  101.     rc = WRITE( hdl, CDPCM_ptr, len );
  102.     if ( rc != len ){
  103.         printf("書き込みエラー\n");
  104.         CLOSE(hdl);
  105.         EndtDisp(1);
  106.     }
  107.     write_size += len;        /* DISKに書き込んだサイズ*/
  108.     break;
  109. case CONVERT_PCMR:
  110. case CONVERT_PCML:
  111. case CONVERT_PCMM:
  112.     /*------------ 44.1kHz 16BIT モノラル ------------*/
  113.     /*---- Intel列びを直し、モノラルに ----*/
  114.     switch( pcm_mode ){
  115.      case CONVERT_PCMR:
  116.         printf_(" ★Convert [Intel stereo -> Motorola mono] (right only)" CFC "\n" CUP);
  117.         len =  PLH2PCMMONO( CDPCM_ptr,CDPCM_ptr,len,2 );
  118.         break;
  119.      case CONVERT_PCML:
  120.         printf_(" ★Convert [Intel stereo -> Motorola mono] (left only)" CFC "\n" CUP);
  121.         len =  PLH2PCMMONO( CDPCM_ptr,CDPCM_ptr,len,1 );
  122.         break;
  123.      case CONVERT_PCMM:
  124.         printf_(" ★Convert [Intel stereo -> Motorola mono] (mix)" CFC "\n" CUP);
  125.         len =  PLH2PCMMONO( CDPCM_ptr,CDPCM_ptr,len,0 );
  126.         break;
  127.     }
  128.     ///*---- ボリュームいじる ----*/
  129.     //len =  PCMVOL( CDPCMM_ptr,CDPCM_ptr,len,waru,4 );
  130.     /*---- 書き込む ----*/
  131.     printf_(" ★Disk Writing" CFC "\n" CUP);
  132.     rc = WRITE( hdl, CDPCM_ptr, len );
  133.     if ( rc != len ){
  134.         printf("書き込みエラー\n");
  135.         CLOSE(hdl);
  136.         EndtDisp(1);
  137.     }
  138.     write_size += len;        /* DISKに書き込んだサイズ*/
  139.     break;
  140.  
  141. case CONVERT_PCM15:
  142.     /*------------ 15.6kHz モノラル ------------*/
  143.     /*---- Intel列びを直し、モノラルに ----*/
  144.     switch( convert_mode ){
  145.      case CONVERT_R:
  146.      case CONVERT_AVE_R:
  147.         printf_(" ★Convert [Intel stereo -> Motorola mono] (right only)" CFC "\n" CUP);
  148.         len =  PLH2PCMMONO( CDPCM_ptr,CDPCM_ptr,len,2 );
  149.         break;
  150.      case CONVERT_L:
  151.      case CONVERT_AVE_L:
  152.         printf_(" ★Convert [Intel stereo -> Motorola mono] (left only)" CFC "\n" CUP);
  153.         len =  PLH2PCMMONO( CDPCM_ptr,CDPCM_ptr,len,1 );
  154.         break;
  155.      case CONVERT_M:
  156.      case CONVERT_AVE_M:
  157.         printf_(" ★Convert [Intel stereo -> Motorola mono] (mix)" CFC "\n" CUP);
  158.         len =  PLH2PCMMONO( CDPCM_ptr,CDPCM_ptr,len,0 );
  159.         break;
  160.     }
  161.     /*---- 44.1kHz -> 15.6kHz & ボリュームいじる ----*/
  162.     switch( convert_mode ){
  163.      case CONVERT_AVE_R:
  164.      case CONVERT_AVE_L:
  165.      case CONVERT_AVE_M:
  166.         printf_(" ★Convert [44.100kHz -> %skHz] (supp.)" CFC "\n" CUP ,pcm_rate_str);
  167.         if ( waru==4 )
  168.             len = PCMFFREQ(    (void*)CDPCMM_ptr,(void*)CDPCM_ptr,len,pcm_rate,44100);
  169.         else    len = PCMFFREQVOL( (void*)CDPCMM_ptr,(void*)CDPCM_ptr,len,pcm_rate,44100,waru,4);
  170.         break;
  171.      case CONVERT_M:
  172.      case CONVERT_R:
  173.      case CONVERT_L:
  174.         printf_(" ★Convert [44.100kHz -> %skHz]" CFC "\n" CUP ,pcm_rate_str);
  175.         if ( waru==4 )
  176.             len = PCMFREQ(    (void*)CDPCMM_ptr,(void*)CDPCM_ptr,len,pcm_rate,44100);
  177.         else    len = PCMFREQVOL( (void*)CDPCMM_ptr,(void*)CDPCM_ptr,len,pcm_rate,44100,waru,4);
  178.         break;
  179.     }
  180.     if ( adpcm_flg == 0 ){
  181.         /*---- 15.6kHz 16BIT MONAURAL データ書き込み ----*/
  182.         printf_(" ★Disk Writing" CFC "\n" CUP);
  183.         rc = WRITE( hdl, CDPCMM_ptr, len );
  184.     } else {
  185.         /*---- ADPCM に変換、データ書き込み -----*/
  186.         printf_(" ★Convert [PCM -> ADPCM]" CFC "\n" CUP);
  187.         len=P162PCM( CDPCM_ptr,(void*)CDPCMM_ptr,len );
  188.         printf_(" ★Disk Writing" CFC "\n" CUP);
  189.         rc = WRITE( hdl, CDPCM_ptr, len );
  190.     }
  191.     if ( rc != len ) {
  192.         printf("書き込みに失敗しました。\n");
  193.         CLOSE(hdl);
  194.         EndtDisp(1);
  195.     }
  196.     write_size += len;        /* DISKに書き込んだサイズ*/
  197. }
  198. return;
  199. }
  200.  
  201. asm("
  202.  
  203. *****************************************************************
  204. *         Intel 44.1kHz 16BIT ステレオ            *
  205. *                ↓                *
  206. *        Motorola 44.1kHz 16BIT モノラル            *
  207. *****************************************************************
  208. _PLH2PCMMONO::
  209.  
  210. ~src_ptr    reg    a5
  211. ~dest_ptr    reg    a4
  212. ~param        reg    d7
  213. ~src_size    reg    d6
  214.  
  215. *    in    4(sp)    pcm data(16bit)        out data address (motorola)
  216. *        8(sp)    pcm data(16bit)        in data address (intel)
  217. *        12(sp)    pcm data(16bit)        data size(n byte)
  218. *        16(sp)    monoral mode        0=(L+R)/2,1=L,2=R,3=L+R
  219.  
  220. *    out    d0    pcm data(16bit)        data size(n byte)
  221.  
  222.     movem.l    d1-d7/a0-a6,-(sp)
  223.  
  224.     move.l    4*14+4(sp),~dest_ptr
  225.     move.l    4*14+8(sp),~src_ptr
  226.     move.l    4*14+12(sp),~src_size
  227.     move.l    4*14+16(sp),~param
  228.  
  229.     andi.w    #3,~param
  230.     lsr.l    #2,~src_size
  231.  
  232.     tst.l    ~src_size
  233.     beq    9f
  234.  
  235.     cmpi.w    #2,~param
  236.     bhi    PMONO_main_LR
  237.     beq    PMONO_main_R
  238.     tst.w    ~param
  239.     bne    PMONO_main_L
  240. PMONO_main_LRMIX:
  241. @@:
  242.     move.w    (~src_ptr)+,d0
  243.     ror.w    #8,d0        *intel->moto
  244.     move.w    (~src_ptr)+,d1
  245.     ror.w    #8,d1        *intel->moto
  246.     ext.l    d0
  247.     ext.l    d1
  248.     add.l    d1,d0
  249.     asr.l    #1,d0
  250.     move.w    d0,(~dest_ptr)+
  251.     subq.l    #1,~src_size
  252.     bne    @b
  253.     bra    9f
  254. PMONO_main_L:
  255. @@:
  256.     move.w    (~src_ptr)+,d0
  257.     ror.w    #8,d0        *intel->moto
  258.     move.w    d0,(~dest_ptr)+
  259.     addq.w    #2,~src_ptr
  260.     subq.l    #1,~src_size
  261.     bne    @b
  262.     bra    9f
  263. PMONO_main_R:
  264. @@:
  265.     addq.w    #2,~src_ptr
  266.     move.w    (~src_ptr)+,d0
  267.     ror.w    #8,d0        *intel->moto
  268.     move.w    d0,(~dest_ptr)+
  269.     subq.l    #1,~src_size
  270.     bne    @b
  271.     bra    9f
  272. PMONO_main_LR:
  273. @@:
  274.     move.w    (~src_ptr)+,d0
  275.     ror.w    #8,d0        *intel->moto
  276.     move.w    (~src_ptr)+,d1
  277.     ror.w    #8,d1        *intel->moto
  278.     add.w    d1,d0
  279.     move.w    d0,(~dest_ptr)+
  280.     subq.l    #1,~src_size
  281.     bne    @b
  282.     *bra    9f
  283. 9:
  284.     move.l    4*14+12(sp),d0
  285.     lsr.l    #1,d0
  286.     movem.l    (sp)+,d1-d7/a0-a6
  287.     rts
  288.  
  289. *****************************************************************
  290. *             Intel 16BIT ステレオ            *
  291. *                ↓                *
  292. *            Motorola 16BIT ステレオ            *
  293. *****************************************************************
  294. _PLH2P16__:
  295.  
  296. *    in    4(sp)    pcm data(16bit)        data address (変換後は -2 からが)
  297. *        8(sp)    pcm data(16bit)        data size(n byte)
  298. *
  299. *    out    d0    pcm data(16bit)        data size(n byte)
  300.  
  301.     lea    $CBC.w,a1
  302.     moveq    #$82,d0            *IOCS _B_BPEEK
  303.     trap    #15
  304.     cmpi.b    #3+1,d0
  305.     bcs    _PLH2P16_M0
  306.     *--- MPU 4~
  307.     move.l    4(sp),a0
  308.     move.l    8(sp),d0
  309. @@:
  310.     cmpi.l    #128,d0
  311.     bcs    _PLH2P16_EE
  312.     .rept    4            * 128byte 分処理
  313.     move.b    1(a0),-1(a0)
  314.     move.b    3(a0),1(a0)
  315.     move.b    5(a0),3(a0)
  316.     move.b    7(a0),5(a0)
  317.     move.b    9(a0),7(a0)
  318.     move.b    11(a0),9(a0)
  319.     move.b    13(a0),11(a0)
  320.     move.b    15(a0),13(a0)
  321.     move.b    17(a0),15(a0)
  322.     move.b    19(a0),17(a0)
  323.     move.b    21(a0),19(a0)
  324.     move.b    23(a0),21(a0)
  325.     move.b    25(a0),23(a0)
  326.     move.b    27(a0),25(a0)
  327.     move.b    29(a0),27(a0)
  328.     move.b    31(a0),29(a0)
  329.     lea    2*16(a0),a0
  330.     .endm
  331.     sub.l    #128,d0
  332.     bra    @b
  333.  
  334. _PLH2P16_M0:
  335.     *--- MPU 0 3
  336.     move.l    4(sp),a0
  337.     move.l    8(sp),d0
  338. @@:
  339.     cmpi.l    #256,d0
  340.     bcs    _PLH2P16_EE
  341.     .rept    8            * 256byte 分処理
  342.     movep.l    1(a0),d1        *4
  343.     movep.l    d1,-1(a0)
  344.     movep.l    9(a0),d1        *4
  345.     movep.l    d1,7(a0)
  346.     movep.l    17(a0),d1        *4
  347.     movep.l    d1,15(a0)
  348.     movep.l    25(a0),d1        *4
  349.     movep.l    d1,23(a0)
  350.     lea    2*16(a0),a0
  351.     .endm
  352.     sub.l    #256,d0
  353.     bra    @b
  354.  
  355. _PLH2P16_EE:
  356.     tst.l    d0
  357.     beq    1f
  358. @@:
  359.     move.b    1(a0),-1(a0)
  360.     addq.l    #2,a0
  361.     subq.l    #2,d0            * byte なので...
  362.     bne    @b
  363. 1:
  364.     move.l    8(sp),d0
  365.     rts
  366.  
  367.  
  368. *****************************************************************
  369. *            ステレオ half rate            *
  370. *****************************************************************
  371. _PCMHRATE_::
  372.  
  373. *    in    4(sp)    pcm data(16bit)        data address
  374. *        8(sp)    pcm data(16bit)        data size(n byte)
  375. *
  376. *    out    d0    pcm data(16bit)        data size(n byte)
  377.  
  378.     move.l    4(sp),a0
  379.     movea.l    a0,a1
  380.     move.l    8(sp),d0
  381.     lsr.l    #3,d0        * 1/8 。4の倍数のはず..
  382. @@:
  383.     move.l    (a0),(a1)+
  384.     addq.l    #8,a0
  385.     subq.l    #1,d0
  386.     bne    @b
  387.  
  388.     move.l    8(sp),d0
  389.     lsr.l    #1,d0        * 1/2 。
  390.     rts
  391.  
  392. *****************************************************************
  393. *            ステレオ double rate            *
  394. *****************************************************************
  395. _PCMDRATE_::
  396.  
  397. *    in    4(sp)    pcm data(16bit)        data address
  398. *        8(sp)    pcm data(16bit)        data size(n byte)
  399. *        12(sp)  out 用pcm data address
  400. *
  401. *    out    d0    pcm data(16bit)        data size(n byte)
  402.  
  403.     movea.l    4(sp),a0
  404.     movea.l    12(sp),a1
  405.     move.l    8(sp),d0
  406.     lsr.l    #2,d0        * 1/4 。4の倍数のはず..
  407. @@:
  408.     move.w    (a0)+,d1
  409.     move.w    (a0)+,d2
  410.     move.w    d1,(a1)+
  411.     move.w    d2,(a1)+
  412.     move.w    d1,(a1)+
  413.     move.w    d2,(a1)+
  414.     subq.l    #1,d0
  415.     bne    @b
  416.  
  417.     move.l    8(sp),d0
  418.     add.l    d0,d0        * 1/2 。
  419.     rts
  420.  
  421.  
  422. *****************************************************************
  423. *             YM ADPCM 可!!            *
  424. *****************************************************************
  425.  
  426. *機能:     PCM->ADPCM変換用のバッファを作成します。
  427. *    これを実行しないと変換ができません。
  428. _PTOA_MAKE_BUFFER::
  429.     jbra    ptoa_make_buffer
  430. *    rts
  431.  
  432. _PTOA_INIT::
  433.     move.l    #-1,d0
  434.     jbra    ptoa_init
  435. *    rts
  436.  
  437. _PTOA_EXEC::
  438.     move.l    4(sp),a1        * ADPCMのアドレス
  439.     move.l    8(sp),a0        * PCMのアドレス
  440.     move.l    12(sp),d0        * PCMのサイズ
  441.     jbra    ptoa_exec        * PCM->ADPCM変換を実行
  442. *    rts
  443.  
  444.  
  445. ");
  446. /**********************************
  447.     名前計算
  448. **********************************/
  449. char *NameCenter(na)
  450. unsigned char *na;
  451. {
  452. #define jstrlen_(SR)                                \
  453. ({     char *st_=(SR);    int l_=0,c_;                        \
  454.     while( c_=*(st_++) ){                            \
  455.         l_++;                                \
  456.         if ( (c_>=0x80&&c_<=0x9f)||c_>=0xE0 ){                \
  457.             if ( c_>0x80 && c_<0xF0 )                \
  458.                 l_++;                        \
  459.             st_++;                            \
  460.         }                                \
  461.     } (l_);                                    \
  462. })
  463. int    i,l,c;
  464. static unsigned char buf[64];
  465. unsigned char *s;
  466. unsigned char *ac=buf;
  467. i=0;
  468. s=(void*)CDCTNAME(-1);
  469. if ( s!=0 && s[0]!=' ' ){    // CD名
  470.     l=jstrlen_(na);
  471.     for(;i<(36-l)/2;i++)
  472.         *ac++=0x20;
  473. }
  474. for(;i<36-1+1;){
  475.     c=*na++;
  476.     if ( c==0 )
  477.         break;
  478.     i++;
  479.     *ac++=c;
  480.     if ( (c>=0x80 && c<=0x9f) || c>=0xE0 ){
  481.         i++;
  482.         *ac++=*na++;
  483.     }
  484. }
  485. for(;i<36-1+1;i++)
  486.     *ac++=0x20;
  487. *ac=0;
  488. return(buf);
  489. }
  490. /********************************************************
  491.             CDC連絡
  492. ********************************************************/
  493. int    CDCID()
  494. {
  495. if ( CDC_CHK()==0 )
  496.     return(-1);
  497. if ( CDC_VERSION()<0x109 )
  498.     return(-1);
  499. if ( CDC_POWER(-1)==0 )
  500.     return(-1);
  501. if ( CDC_CHGLUN(-1)>=100 )    // JUKE BOX になっている
  502.     return(-1);
  503. return( CDC_SCSIID() );
  504. }
  505. /*+++++++*/
  506. char    *CDCTNAME(t)
  507. int    t;
  508. {
  509. struct    CDC_TRACKS_PTR *TP;
  510. struct    CDC_ATRACK_PTR *AP;
  511. char    *s;
  512. if ( CDCID()<0 )
  513.     return(0);
  514. if ( t<0 ){
  515.     TP=CDC_TRACKS();
  516.     s=(void*)&(TP->CDNAME);
  517. } else {
  518.     AP=CDC_ATRACK(t);
  519.     s=AP->NAME;
  520. }
  521. if ( *s==0 )
  522.     return(0);
  523. return(s);
  524. }
  525. /*+++++++*/
  526. void    CDCRESET()
  527. {
  528. if ( CDCID()<0 )
  529.     return;
  530. CDC_RELED();
  531. }
  532.